package compatibilite;

import graph.Tableur;

import java.util.ArrayList;
import java.util.Observable;

import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
/**
 * 
 * @author Axel
 * Modele generique avec quelques outils qui pourrait etre interessant selon le plugin
 * les fonctions que tous les modeles de nos plugs utiliseront sont 
 * majObserver() qui notifiera le controlleur selon le contexte (fonction terminee, graph dessine etc)
 * charger(tablemodel ) qui recuperera la reference du tableur principal
 *
 */
public abstract class AExcelMiniModele extends Observable implements IExcelMiniModele {
	protected TableModel tm;
	protected JTable jt;
	protected Tableur tableur;
	public void majObserver(String action, TableModel liste){
		setChanged();
		tm = liste;
		notifyObservers(action);
	}
	public void charger(Tableur tableur) {
		this.tableur = tableur;
		this.jt = tableur.getTableur();
		this.tm = this.jt.getModel();
	}
	@SuppressWarnings("unchecked")
	protected <T> ArrayList<T> convertTableModelToArray(TableModel tm, T type){
		int i;
		T val;
		ArrayList<T> source = new ArrayList<T>();
		for(i=0;i<tm.getRowCount();i++){
			val = (T)(tm.getValueAt(i, 0));
			if(!(val==null)){
				source.add(val);
			}
		}
		return source;
	}
	
	protected void supprimerVidesTabModel(TableModel tm){
		int i;
		int nonNull=0;
		int max = tm.getRowCount();
		Object val;
		DefaultTableModel modele = (DefaultTableModel)tm;
		Object[] tmClean = new Object[max];
		for(i=0;i<max;i++){
			val = tm.getValueAt(i, 0);
			if(val != null){
				tmClean[nonNull] = val;
				nonNull++;
			}
		} 
		for(i=modele.getRowCount()-1;i>0;i--){
			modele.removeRow(i);
		}
		modele.setRowCount(max);
		for(i=0;i<nonNull;i++){
			modele.setValueAt(tmClean[i], i, 0);
		}
	}
	public TableModel getTableModel(){
		return tm;
	}
}
